const { execSync, exec } = require("child_process");

// ffmpeg 是一个庞大的项目，包含很多组件和库文件，常用的方式是通过命令行工具。

// ffmpeg {1} {2} -i {3} {4} {5}
// 1. 全局参数
// 2. 输入文件参数
// 3. 输入文件
// 4. 输出文件参数
// 5. 输出文件

{
  `
  ffmpeg \
  -y \ #
  -c:v libx264 -c:a libfdk_acc \ # 输入文件参数
  -i test.mp4 \
  -c:v libvpx-vp9 -c:a libvorbis \ # 输出文件参数
  test.webm # 输出文件参数
  `;
  // -c:v # 指定视频编码格式
  // -c:a # 指定音频编码格式

  // 不指明编码格式，FFmpeg 会自动判断输入文件的编码。
  ("ffmpeg -i test.mp4 test.webm"); // 等价于上面的命令

  // 常用命令行参数
  // -c: 指定编码器
  // -c copy: 直接复制，不经过重新编码（这样比较快）
  // -c:v: 指定视频编码器
  // -c:a: 指定音频编码器
  // -i: 指定输入文件
  // -an: 去除音频流
  // -vn: 去除视频流
  // -preset: 指定输出的视频质量，会影响文件的生成速度，有 ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow, placebo 等可选值，默认是 medium
  // -y: 不经过确认，直接覆盖输出文件
}

{
  // 查看文件信息
  // execSync("ffmpeg.exe -i test.mp4 -hide_banner", { stdio: "inherit" });
  // 显示视频文件的元信息，-hide_banner 参数可以隐藏 FFmpeg 的版权信息
}

{
  // 转换编码格式
  // 将视频编码格式 H.264 转成 H.265
  // execSync("ffmpeg.exe -i test.mp4 -c:v libx265 output.mp4", {
  //   stdio: "inherit",
  // });
}

{
  // 转换容器格式（文件格式）
  // 获取gif
  // execSync("ffmpeg.exe -i test.mp4 test.gif", { stdio: "inherit" });
}

{
  // 调整码率
  // 改变编码的比特率，一般用来将视频文件的体积变小。
  // 码率最小值 -minrate，最大值 -maxrate，缓冲区大小 -bufsize
  // execSync(
  //   "ffmpeg.exe -i test.mp4 -minrate 964K -maxrate 3856K -bufsize 2000K output1.mp4",
  //   { stdio: "inherit" }
  // );
}

{
  // 改变分辨率
  // 将分辨率从 1080 转成 480
  // execSync("ffmpeg.exe -i test.mp4 -vf scale=480:-1 output2.mp4", {
  //   stdio: "inherit",
  // });
}

{
  // 提取音频
  // execSync("ffmpeg.exe -i test.mp4 -vn -c:a copy output3.aac", {
  //   stdio: "inherit",
  // });
  // -vn: 去掉视频
  // -c:a copy 不改变音频编码，直接拷贝
}

{
  // 添加音轨
  // 添加音轨指的是将外部音频加入视频，比如添加背景音乐或旁白
  // execSync("ffmpeg.exe -i darwen.mp3 -i test.mp4 mix.mp4", {
  //   stdio: "inherit",
  // });
}

{
  // 截图
  // 从1分24秒开始截取1秒的图片，图片数量根据帧数决定
  // execSync(
  //   "ffmpeg.exe -i test.mp4 -ss 00:01:24 -t 00:00:01 ./image/%03d.jpeg",
  //   { stdio: "inherit" }
  // );
  // 只需要一张图的话可以只截取一帧
  // execSync("ffmpeg.exe -ss 00:01:24 -i test.mp4 -vframes 1 -q:v 2 output.jpg");
  // -vframes 1 指定只截取一帧，-q:v 2 表示输出的图片质量，一般是1到5之间（1为质量最高）
}

{
  // 裁剪
  // 从 1 分 24 秒开始，截取 10 秒的视频
  // execSync("ffmpeg.exe -i test.mp4 -ss 00:01:24 -t 00:00:10 output3.mp4", {
  //   stdio: "inherit",
  // });
}

{
  // 水印
  // execSync(
  //   "ffmpeg.exe -i output.jpg -i output3.aac -c:v libx264 -c:a aac -b:a 192k -shortest output5.mp4",
  //   {
  //     stdio: "inherit",
  //   }
  // );

  try {
    execSync(
      "ffmpeg.exe -i output.mp4 -vf \"drawtext=text='bwfang':fontcolor=white:fontsize=24:x=10:y=10\" output5.mp4",
      {
        stdio: "inherit",
      }
    );
  } catch (error) {
    console.error("Error executing ffmpeg command:", error);
  }
}
